#pragma once

#include "google/protobuf/service.h"
#include "ZookeeperUtil.h"

// #include <muduo/net/TcpServer.h>
// #include <muduo/net/EventLoop.h>
// #include <muduo/net/InetAddress.h>
// #include <muduo/net/TcpConnection.h>

#include <myMuduo/TcpServer.h>   // 使用自己重写的moduo库测试成功

#include <google/protobuf/descriptor.h>
#include <string>
#include <unordered_map>

// 框架所提供的，专门负责发布rpc服务的网络对象类
class MprpcProvider
{
public:
    // 框架提供给外部使用的，用来发布rpc方法的函数接口
    // 这里的参数设为::google::protobuf::Service*，因为这是框架，要接受所有的服务
    // 我们编写的服务都继承自fixbug::UserServiceRpc，而他又继承自::google::protobuf::Service*
    void NotifyService(::google::protobuf::Service *service);

    // 启动rpc服务节点，开始提供rpc远程网络调用服务
    void Run();

private:
    // // 新连接建立的回调
    // void OnConnection(const muduo::net::TcpConnectionPtr &);
    // // 已建立连接的读写事件的回调 TO PONDER
    // void OnMessage(const muduo::net::TcpConnectionPtr &, muduo::net::Buffer *, muduo::Timestamp);

    // void senRpcResponse(const muduo::net::TcpConnectionPtr &, google::protobuf::Message*);

    // muduo::net::EventLoop m_eventLoop;
    // // 定义一个 服务对象信息 结构体

    // 新连接建立的回调
    void OnConnection(const TcpConnectionPtr &);
    // 已建立连接的读写事件的回调 TO PONDER
    void OnMessage(const TcpConnectionPtr &, Buffer *, Timestamp);

    void senRpcResponse(const TcpConnectionPtr &, google::protobuf::Message*);

    EventLoop m_eventLoop;
    // 定义一个 服务对象信息 结构体
    struct ServiceInfo
    {
        google::protobuf::Service *m_service; // 服务对象
        // 记录该服务对象所含的 <函数方法名，函数方法描述指针>
        std::unordered_map<std::string, const google::protobuf::MethodDescriptor *> m_methodMap;
    };
    // 记录 <服务对象名，服务对象信息>
    std::unordered_map<std::string, struct ServiceInfo> m_serviceMap;
};